package global

import (
	"fmt"
	log "code.google.com/p/log4go"
	"errors"
	"strings"
	"EasyCollect/util"
)

func CheckConfigErr() error{

	tasks := Config().Tasks
	count :=0
	for index := range tasks {
		task := tasks[index]
		if task.IsUse {
			count ++
			//关键的配置不能为空
			if task.TaskId=="" ||task.TaskName==""|| task.Thread==0 ||task.SrcIp==""||
				task.SrcPort==""||task.SrcCharacterEncoding==""||task.SrcDatabase==""||task.SrcTable==""||
					task.SrcUsername==""||task.SrcPassword==""||task.SrcMaxOpenConns==0||task.SrcMaxIdleConns==0||
						task.TargetIp==""||task.TargetPort==""|| task.TargetCharacterEncoding==""||task.TargetDatabase==""||
							task.TargetTable==""||task.TargetUsername==""||task.TargetPassword==""||task.TargetMaxIdleConns==0||
								task.TargetMaxOpenConns==0{

				errStr := fmt.Sprintf(
					"your config have empty value。required cloumn must not be empty。" +
						" taskId: [%s] taskName: [%s] taskThread: [%v] ScrIp: [%s]" +
						"SrcPort: [%s] SrcCharacterEncoding: [%s] SrcDatabase: [%s] SrcTable: [%s] SrcUsername: [%s] SrcPassword: [%s]" +
						"SrcMaxOpenConns: [%v] SrcMaxIdleConns: [%v] TargetIp: [%s] TargetPort: [%s] TargetCharacterEncoding: [%s]" +
							"TargetDatabase: [%s] TargetUsername: [%s] TargetUsername:[%s] TargetPassword: [%s] TargetMaxIdleConns :[%v] TargetMaxOpenConns:[%v]",
					task.TaskId,task.TaskName,task.Thread,task.SrcIp,task.SrcPort,task.SrcCharacterEncoding,task.SrcDatabase,task.SrcTable,
					task.SrcUsername,task.SrcPassword,task.SrcMaxOpenConns,task.SrcMaxIdleConns,task.TargetIp,task.TargetPort,task.TargetCharacterEncoding,task.TargetDatabase,
					task.TargetTable,task.TargetUsername,task.TargetPassword,task.TargetMaxIdleConns,task.TargetMaxOpenConns)

				log.Error(errStr)
				return errors.New(errStr)

			}
			//限制targetType必须只能填写insert或者update
			if task.TargetType!=InsertType && task.TargetType!=UpdateType {

				errStr := fmt.Sprintf(
					"taskId:[%s] taskName :[%s] your target-type config is wrong。your :[%s] required [%s] or [%s]",
					task.TaskId,task.TaskName,task.TargetType,InsertType,UpdateType)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//如果TargetType为update，则target-update-condition必须要配置
			if task.TargetType==UpdateType && len(task.TargetUpdateCondition)==0 {

				errStr := fmt.Sprintf(
					"taskId:[%s] taskName :[%s] your target-type config is [%s] so target-update-condition is required. your: %s",
					task.TaskId,task.TaskName,task.TargetType,task.TargetUpdateCondition)
				log.Error(errStr)
				return errors.New(errStr)
			}

			//如果源数据库没有配置src-query，并且也没有配置src-condition,是不允许的。此时无法获知要查询的sql语句。
			if task.SrcQuery==""&& task.SrcCondition=="" {
				errStr := fmt.Sprintf(
					"taskId:[%s] taskName :[%s] your src-query is empty ,your src-condition is empty ,not allowed! ",
					task.TaskId,task.TaskName)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//src-query 的配置只能是select语句，也就是说，只能以select开头
			if task.SrcQuery!="" && !strings.HasPrefix(util.ToLowerCase(task.SrcQuery),SelectPrefix) {

				errStr := fmt.Sprintf(
					"taskId:[%s] taskName :[%s] src-query must start with %s your: [%s] ",
					task.TaskId,task.TaskName,SelectPrefix,task.SrcQuery)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//如果src-query为空，但是srcCondition不为空，说明这是一个搬表sql，此时，SrcParameter为空，不允许。
			if task.SrcQuery==""&&task.SrcCondition!=""&&(task.SrcKey==""||len(task.SrcParameter)==0){

				errStr := fmt.Sprintf(
					"taskId:[%s] taskName :[%s] when src-query is empty ,src-condition is not empty.so src-parameter is not be empty ,your is empty",
					task.TaskId,task.TaskName)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//如果src-delete是true。表示这个任务，查询完成后要回删记录，因此，不能不设置key，要不然无法根据关键字段进行回删
			if task.SrcDelete && task.SrcKey=="" {

				errStr := fmt.Sprintf(
					"taskId:[%s] taskName: [%s] your scr-delete is true,so src-key is must not be empty. your :[%s]",
					task.TaskId,task.TaskName,task.SrcKey)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//ShardingColumn和ShardingCount要么同时为空，要么同时不为空
			if (task.ShardingColumn==""&& task.ShardingCount>0)||(task.ShardingCount==0&&task.ShardingColumn!=""){
				errStr := fmt.Sprintf(
					"taskId:[%s] taskName: [%s] sharding-count and  sharding-column must all be empty or all be not empty! your sharding-count [%v] sharding-column [%s]",
					task.TaskId,task.TaskName,task.ShardingCount,task.ShardingColumn)
				log.Error(errStr)
				return errors.New(errStr)
			}
			//TargetBeforeSql必须包含where条件
			if task.TargetBeforeSql!="" && !strings.Contains(task.TargetBeforeSql,"where"){
				errStr := fmt.Sprintf(
					"taskId:[%s] taskName: [%s] TargetBeforeSql must contails where yours [%s]",
					task.TaskId,task.TaskName,task.TargetBeforeSql)
				log.Error(errStr)
				return errors.New(errStr)
			}
		}
	}
	if count==0 {
		return errors.New("tasks[inUse:true] must not be empty ")
	}
	return nil
}
